package cn.kent.simple;

import java.util.HashMap;
import java.util.Map;

/**
 * 389. 找不同
 * 基于 ASCII 码值的还有三种方法：
 * 1. 求和  -->  将1,2字符串所有码值加起来，相减得到差值
 * 2. 计数  -->  利用ASCII码和'a'的差值，作为横坐标，然后计数存值 -> 两个字符串分别计算，直到计数为负数或为0，说明找到值
 * 3. 位运算 -->  如下，思路：将两个字符串分别进行位运算，最后的差值就是不同值
 *         int ret = 0;
 *         for (int i = 0; i < s.length(); ++i) {
 *             ret ^= s.charAt(i);
 *         }
 */
public class FindTheDifference {
    public static void main(String[] args) {
        String s = "a";
        String t = "aa";
        // System.out.println(findTheDifference(s, t));

        int ret = 0;
        for (int i = 0; i < s.length(); ++i) {
            ret ^= s.charAt(i);
        }

    }

    /**
     * 14ms
     */
    public static char findTheDifference(String s, String t) {
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            Integer integer = map.get(s.charAt(i));
            if (integer != null) {
                map.put(s.charAt(i), ++integer);
            } else {
                map.put(s.charAt(i), 1);
            }
        }
        for (int i = 0; i < t.length(); i++) {
            if (map.get(t.charAt(i)) == null) {
                return t.charAt(i);
            } else {
                if (map.get(t.charAt(i)) == 0) {
                    return t.charAt(i);
                } else {
                    Integer integer = map.get(t.charAt(i));
                    map.put(t.charAt(i), --integer);
                }
            }
        }
        return '0';
    }
}
